package simple.tree;

import struct.Node;

import java.util.*;

/**
 * <a href="https://leetcode.cn/problems/n-ary-tree-preorder-traversal/">589. N 叉树的前序遍历</a>
 * 给定一个 n 叉树的根节点  root ，返回 其节点值的 前序遍历 。
 * n 叉树 在输入中按层序遍历进行序列化表示，每组子节点由空值 null 分隔（请参见示例）。
 * 示例 1：
 *   输入：root = [1,null,3,2,4,null,5,6]
 *   输出：[1,3,5,6,2,4]
 * 示例 2：
 *   输入：root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
 *   输出：[1,2,3,6,7,11,14,4,8,12,5,9,13,10]
 * 提示：
 *   节点总数在范围 [0, 10^4]内
 *   0 <= Node.val <= 10^4
 *   n 叉树的高度小于或等于 1000
 * @author 刘学松
 * @date 2023-06-09 9:27
 */
public class N叉树的前序遍历 {
    public List<Integer> preorder(Node root) {
        List<Integer> list = new ArrayList<>();
        dfs(root, list);
        return list;
    }

    public void dfs(Node node, List<Integer> list) {
        if (node != null) {
            list.add(node.val);
            for (Node child : node.children) {
                dfs(child, list);
            }
        }
    }

    public void iterate(Node root, List<Integer> list) {
        if (root == null) {
            return;
        }
        Stack<Node> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            Node node = stack.pop();
            list.add(node.val);
            for (int i = node.children.size()-1; i >= 0; i--) {
                stack.push(node.children.get(i));
            }
        }
    }
}
